#pragma once
_Pragma("once")

// #include <iostream>
// #include <tuple>
// #include <utility>
// #include <cmath>

//win64下用double型，arm32用float
#ifdef _win64系统
typedef double floatx;
#else 
typedef float floatx;
#endif

typedef struct 
{
    floatx kp;
    floatx ki;

    floatx upper;//限幅
    floatx lower;//限幅

    floatx y_init;//输出的初始值

    //float Ts;//采样时间

    floatx yi; //积分值
    floatx y;//输出信号

} PI;

typedef struct 
{
    floatx k; //增益
    floatx k0;//直流抑制增益

    floatx X1;//正交信号输出
    floatx X2;//正交信号输出
    floatx X0;//直流抑制信号

} SOGI;

typedef struct 
{
    floatx θ;//相位
    floatx f;//频率
    floatx A;//幅值

    struct {
        floatx q_err;//滤波后q轴量
    }中间量;
    
    
    floatx f_lower;//低通滤波器频率    
    PI    sPI1;//PI调节器
    floatx PI_autoGain_min;//PI自动自动增益系数最小值
    SOGI  sSOGI1;//正交信号输出   
    

} PLL_SOGI;




// Function declaration
#ifdef __cplusplus
extern "C" {
#endif

extern PLL_SOGI* PLL_SOGI_Creat();

extern void PLL_SOGI_Cal(
    PLL_SOGI *p,
    float ui, float f0,
    float PI_kp, float PI_ki, float PI_upper, float PI_lower,
    float PI_autoGain_min,
    float f_lower,
    float SOG_k, float SOG_k0,
    float Ts,
    float *ptheta, float *pA, float *pf,
    int reset);

#ifdef __cplusplus
}
#endif




